package adke.gui.animations;

import adke.listeners.PowerupListener;
import adke.managers.GamePowerupManager;
import adke.models.powerups.AbilityPowerup;
import adke.models.powerups.Powerup;
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

public class PowerupAnimation extends Animation implements PowerupListener
{
    private boolean pickedUp;
    private Powerup powerup;
    
    // de x en y zitten al in de powerup
    
    private int frameID;
    private boolean reverse; // geeft aan of de animatie achteruit moet
    
    public PowerupAnimation(Powerup powerup)
    {
        pickedUp = false;
        this.powerup = powerup;
        frameID = 0;
        reverse = false;
        
        GamePowerupManager.addPowerupListener(this);
    }

    public boolean isDone()
    {
        return pickedUp;
    }

    public Rectangle nextFrame(Graphics2D g2d)
    {
        // hier kunnen we experimenteren met het aanroepen van verschillende animaties
        // deze zijn wel exclusief
        
        return squish1(g2d);
//        return squish2(g2d);
    }

    // verschillende animaties
    private Rectangle squish1(Graphics2D g2d)
    {
        // aangezien we hier nu een animatie van kunnen maken moeten
        // we eerst de vorige weghalen
        
        int x = powerup.getX();
        int y = powerup.getY();
        
        // de eerste 4 getallen zijn de linker bovenhoek en rechteronderhoek van de destinatie
        // de laatste 4 van de powerup graphic
        int srcX1 = 0; int srcY1 = 0;
        int srcX2 = Powerup.IMG_DIMENSION; int srcY2 = Powerup.IMG_DIMENSION;
        
        int dstX1 = x; int dstY1 = y;
        int dstX2 = x + Powerup.IMG_DIMENSION; int dstY2 = y + Powerup.IMG_DIMENSION;
        
        // niet transparant
        paintTransparant(g2d);
        
        // de teller waar we ons op afstellen
        int resolution = 40;
        int maxAnimDelta = 10;
        
        // hier moeten we een zo groot mogelijk vlak tekenen dat de animatie kan bespannen
        g2d.fillRect(powerup.getX()-maxAnimDelta, powerup.getY()-maxAnimDelta, Powerup.IMG_DIMENSION+(maxAnimDelta*2), Powerup.IMG_DIMENSION+(maxAnimDelta*2));
        
        paintNormal(g2d);
                
        // teken nieuwe figuur
        
        // s staat voor squish
        int sX1 = dstX1; int sY1 = dstY1;
        int sX2 = dstX2; int sY2 = dstY2;
        
        // nu kijken we of we aan de voorwaarden voldoen om de squish coordinaten te veranderen
        if (frameID%20 == 0)
        {
            int delta = frameID/20;
            if (reverse)
            {
                sX1+=delta; sY1-=delta;
                sX2-=delta; sY2+=delta;
            }
            else
            {
                sX1-=delta; sY1+=delta;
                sX2+=delta; sY2-=delta;
            }
        }
        
        g2d.drawImage(powerup.getGraphic(), sX1, sY1, sX2, sY2, 
                                            srcX1, srcY1, srcX2, srcY2, null);
                
        // laat weten waar we zijn in de animatie
        if (frameID > resolution) reverse = true;
        if (frameID < 0) reverse = false;
        
        // 
        if (reverse) 
        {
            frameID--;
        }
        if (!reverse) 
        {
            frameID++;
        }
        
        // return vlak dat gerepaint moet worden
        // TODO
        return powerup.getLocation();
    }
    
    private Rectangle squish2(Graphics2D g2d)
    {
        int resolution = 40;
        
        // we willen dat de animatie max 10pix indeukt
        int maxAnimDelta = 40;
        
        int x = powerup.getX();
        int y = powerup.getY();
        
        // de eerste 4 getallen zijn de linker bovenhoek en rechteronderhoek van de destinatie
        // de laatste 4 van de powerup graphic
        int srcX1 = 0; int srcY1 = 0;
        int srcX2 = Powerup.IMG_DIMENSION; int srcY2 = Powerup.IMG_DIMENSION;
        
        int dstX1 = x; int dstY1 = y;
        int dstX2 = x + Powerup.IMG_DIMENSION; int dstY2 = y + Powerup.IMG_DIMENSION;
        
        // clear vorige animatie
        clear(x, y, Powerup.IMG_DIMENSION, Powerup.IMG_DIMENSION, maxAnimDelta, maxAnimDelta, g2d);
        
        // CUSTOM SQUISH CODE VOOR SQUISH2
        
        // s staat voor squish
        double sX1 = dstX1; double sY1 = dstY1;
        double sX2 = dstX2; double sY2 = dstY2;
        
        // nu kijken we of we aan de voorwaarden voldoen om de squish coordinaten te veranderen
                
        sY1+=frameID*0.2;
        
        //////////////
        
        
        g2d.drawImage(powerup.getGraphic(), (int)sX1, (int)sY1, (int)sX2, (int)sY2, 
                                            srcX1, srcY1, srcX2, srcY2, null);
        
        // laat weten waar we zijn in de animatie
        if (frameID > resolution) reverse = true;
        if (frameID < 0) reverse = false;
        if (reverse) frameID--;
        if (!reverse) frameID++;
        
        // TODO
        return powerup.getLocation();
    }
    
    // LISTENERS
    
    // als de powerup gepakt wordt moeten we dat weten
    // zodat we isDone kunnen aanzetten
    public void powerupPickedUp(Powerup powerup)
    {
        if (this.powerup == powerup)
            pickedUp = true;
    }
    
    public void powerupActivated(AbilityPowerup powerup){}
    public void powerupDeactivated(AbilityPowerup powerup){}
    public void powerupDropped(Powerup powerup){}
}
